home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / buttons / espin / spin.bas < prev    next >
BASIC Source File  |  1995-07-19  |  4KB  |  136 lines

  1. '   This is an idea I stole from CorelDraw.  The spin button
  2. ' starts slow, then speeds up.  (You can set the speeds by
  3. ' changing constants, below.)
  4.  
  5. '   It also has an alternate mode:
  6. ' pushing the middle segment of the button then dragging
  7. ' the mouse up or down is like an invisible thumbwheel on
  8. ' a scroll bar.
  9.  
  10. '   Right clicks spin by tens instead of by ones. This can be
  11. ' changed to other values if you wish (see constants below)
  12.  
  13. '   To create an enhanced spin button, you need to load
  14. ' FrmESpin at startup (Sub Main or Form_Load).  Then just
  15. ' place an image control on your form, size it and give it a
  16. ' border, set the picture property to SPINP0.BMP, and put
  17. ' subroutine calls in its MouseDown, MouseUp, and MouseMove
  18. ' events.  Not quite as easy as a VBX, but not bad.
  19.  
  20. Option Explicit
  21.  
  22. Global SpinDir As Integer  'mag and direction of spin jump
  23. Global SpinDest As Control 'the e.g. textbox to spin
  24. Global SpinBut As Image    'the image control used as spin button
  25. Global MousePos As Integer 'where the last mousemove was on SpinBut
  26. Global OldMousePos As Integer 'the previous one
  27.  
  28. Global TwipsY As Integer    'holds TwipsY
  29. Global TimerCount As Integer 'for changing speed
  30. Global Jump As Integer
  31.  
  32. Global Const INITDELAY = 150   'start slow
  33. Global Const OTHDELAY = 20     'speed up
  34. Global Const CHANGEDELAY = 7   'after seven slow ones
  35. Global Const LEFTSPIN = 1      'jump 1 for left mouse
  36. Global Const RIGHTSPIN = 10    'jump by 10 for right mouse
  37.  
  38. Sub JDMouseDown (Button As Integer, Y As Single, Img As Image, Txt As Control)
  39.   Dim hgt As Integer
  40.  
  41. ' jump 1 for left, 10 for right button pressed (see constants)
  42.   If Button = 1 Then
  43.     Jump = LEFTSPIN
  44.   ElseIf Button = 2 Then
  45.     Jump = RIGHTSPIN
  46.   End If
  47. ' set timer interval to slow
  48.   FrmESpin.Timer1.Interval = INITDELAY
  49. ' set the picture to make it look pressed
  50.   hgt = Img.Height
  51.   If Y < hgt / 3 Then
  52.   ' pressed up button
  53.     Img.Picture = FrmESpin.Image2(1).Picture
  54.     SpinDir = Jump          'spin up
  55.   ElseIf Y > hgt * 2 / 3 Then
  56.   ' pressed down button
  57.     Img.Picture = FrmESpin.Image2(3).Picture
  58.     SpinDir = -1 * Jump       'spin down
  59.   Else
  60.   ' using invisible thumbwheel
  61.     Img.Picture = FrmESpin.Image2(2).Picture
  62.     SpinDir = 0          'spin with the mouse
  63.     MousePos = Y / TwipsY
  64.     OldMousePos = MousePos  'mouse hasn't moved since the button was pressed
  65.     FrmESpin.Timer1.Interval = 25  'a good value for mousemoves
  66.   End If
  67. ' set globals, so routines know who's spinning who
  68.   Set SpinDest = Txt
  69.   Set SpinBut = Img
  70. ' spin the e.g. textbox
  71.   SpinIt       '1st spin
  72.   TimerCount = 0
  73.   FrmESpin.Timer1.Enabled = True  'subsequent spins
  74.  
  75. End Sub
  76.  
  77. Sub JDMouseMove (Y As Single, Img As Image, Button As Integer)
  78.   Dim hgt As Integer
  79. ' bail if a mouse button is down
  80.   If Button Then
  81.   ' just store the mouse position
  82.     OldMousePos = MousePos
  83.     MousePos = Y / TwipsY
  84.     Exit Sub
  85.   End If
  86. ' change the mousepointer if on center button
  87.   hgt = Img.Height
  88.   If Y < hgt / 3 Then
  89.     Img.MousePointer = 0
  90.   ElseIf Y > hgt * 2 / 3 Then
  91.     Img.MousePointer = 0
  92.   Else
  93.     Img.MousePointer = 7
  94.   End If
  95.  
  96. End Sub
  97.  
  98. Sub JDMouseUp ()
  99. ' stop spinning
  100.   FrmESpin.Timer1.Enabled = False
  101.   If SpinBut Is Nothing Then Exit Sub
  102. ' set button back to unpressed picture
  103.   SpinBut.Picture = FrmESpin.Image2(0).Picture
  104. ' set back to ready to do another
  105.   Set SpinDest = Nothing
  106.   Set SpinBut = Nothing
  107.   MousePos = 0
  108.   OldMousePos = 0
  109.   TimerCount = 0
  110.   FrmESpin.Timer1.Interval = INITDELAY
  111.  
  112. End Sub
  113.  
  114. Sub SpinIt ()
  115.   Dim tmp As Single
  116.  
  117. ' get the current value of the e.g. textbox
  118.   tmp = Val(SpinDest)
  119.   If SpinDir Then
  120.   ' spin up or down
  121.     tmp = tmp + SpinDir '+1 or -1 or etc.
  122.     SpinDest = Trim$(Str$(tmp))
  123.   Else
  124.   ' spin with the mouse
  125.     tmp = tmp + (OldMousePos - MousePos) * Jump
  126.     SpinDest = Trim$(Str$(tmp))
  127.     OldMousePos = MousePos
  128.   End If
  129. ' increment count
  130.   TimerCount = TimerCount + 1
  131. ' speed up if it's time to
  132.   If TimerCount > CHANGEDELAY Then FrmESpin.Timer1.Interval = OTHDELAY
  133.   
  134. End Sub
  135.  
  136.